package datenhaltung;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import model.Einweisung;
import model.Geraet;
import model.Geraetetyp;
import model.Mitarbeiter;
import model.Stationsbevollmaechtigter;

/**
 * Datenhaltung Datenbankzugriff �ber die Klasse Verbindung
 * 
 * @author Julien Rudolph
 */
public class Datenhaltung implements IDatenhaltung {

	@Override
	public List<Einweisung> liefereEinweisungenZuGeraetetyp(Geraetetyp gt) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Einweisung> liefereEinweisungenZuMitarbeiter(String personalNr) {
            try {
                PreparedStatement prep = Verbindung.getConnection().prepareStatement(
                    "SELECT * FROM tbl_Einweisungen WHERE pf_eingewiesener=?");
                prep.setString(1, personalNr);

                ResultSet rs = prep.executeQuery();

                List<Einweisung> result = new ArrayList<>();
                while (rs.next()) {
                        // TODO Auto-generated method stub
                		
                        // Einweisung weisung = new Einweisung();
                        // result.add(weisung);
                }
                Verbindung.closeConnection();
                if (result.isEmpty()) {
                        return null;
                } else {
                        return result;
                }
            } catch (SQLException ex) {
                Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
                Verbindung.closeConnection();
                return null;
            }
	}

	@Override
	public List<Geraetetyp> lieferePflichtEinweisung() {
            try{
                PreparedStatement prep = Verbindung.getConnection().prepareStatement(                 
                    "SELECT * FROM tbl_Geraetetyp WHERE f_Einweisungsnotwendigkeit='Pflicht'");
                ResultSet rs = prep.executeQuery();        
                List<Geraetetyp> result = new ArrayList<>();
                while(rs.next()){
                	Geraetetyp gT = new Geraetetyp(rs.getString("p_Geraetetyp"), rs.getString("Bezeichnung"), rs.getString("Hersteller"));
                	
                	result.add(gT);
                }
                Verbindung.closeConnection();
                if(result.isEmpty()){
                    return null;
                }else{
                    return result;
                }

            }catch(SQLException ex){
                Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
                Verbindung.closeConnection();
                return null;
            }
	}

	@Override
	public List<Geraetetyp> liefereWunschEinweisung() {
            try{
                PreparedStatement prep = Verbindung.getConnection().prepareStatement(                 
                    "SELECT * FROM tbl_Geraetetyp WHERE f_Einweisungsnotwendigkeit='Wunsch'");
                ResultSet rs = prep.executeQuery();        
                List<Geraetetyp> result = new ArrayList<>();
                while(rs.next()){
                    Geraetetyp gT = new Geraetetyp(rs.getString("p_Geraetetyp"), rs.getString("Bezeichnung"), rs.getString("Hersteller"));
                	
                	result.add(gT);
                }
                Verbindung.closeConnection();
                if(result.isEmpty()){
                    return null;
                }else{
                    return result;
                }

            }catch(SQLException ex){
                Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
                Verbindung.closeConnection();
                return null;
            }	
	}

	@Override
	public List<Mitarbeiter> liefereMitarbeiter() {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
              "SELECT * FROM tbl_Mitarbeiter");
			ResultSet rs = prep.executeQuery();
			List<Mitarbeiter> result = new ArrayList<>();
			Mitarbeiter tmp = new Mitarbeiter();
			while (rs.next()) {
				tmp.setAnrede(rs.getString("anrede"));
				tmp.setVorname(rs.getString("vorname"));
                                tmp.setTitel(rs.getString("titel"));
                                tmp.setId(rs.getString("p_personalnummer"));
				tmp.setNachname(rs.getString("nachname"));
                                tmp.setFunktion(rs.getString("funktion"));
				result.add(tmp);
				tmp = new Mitarbeiter();
			}
			Verbindung.closeConnection();
			if (result.isEmpty()) {
				return null;
			} else {
				return result;
			}
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return null;
		}
	}

	@Override
	public String getPasswort(String personalNr) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
              "SELECT passwort FROM tbl_Mitarbeiter WHERE p_personalnummer=?");
			prep.setString(1, personalNr);
			ResultSet rs = prep.executeQuery();
			if (rs.next()) {
				Verbindung.closeConnection();
				return rs.getString(0);
			} else {
				Verbindung.closeConnection();
				return rs.getString(0);
			}
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return "";
		}
	}

	@Override
	public boolean pwAendern(String personalNr, String hashneu) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
              "UPDATE tbl_Mitarbeiter SET passwort =? WHERE p_personalnummer=?");
			prep.setString(1, hashneu);
			prep.setString(2, personalNr);
			if (prep.executeUpdate() != 0) { 
				Verbindung.closeConnection();
				return true;
			} else {
				Verbindung.closeConnection();
				return false;
			}
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return false;
		}

	}

	@Override
	public boolean neuenBevollmaechtigtenHinzufuegen(Stationsbevollmaechtigter s, String pwhash) {
	    return this.personalErfassen(s) && this.pwAendern(s.getId(), pwhash);
	}

	@Override
	public boolean einweisungErfassen(Einweisung einw) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
					"INSERT INTO tbl_Einweisungen(pf_eingewiesener, pf_geraetetyp,f_einweiser, istFehlerhaft, datum ) VALUES (?,?,?,?,?)");
			prep.setString(1, einw.getEingewiesener().getId());
			prep.setString(2, einw.getGeraetetyp().getTyp());			
			prep.setString(3, einw.getErsteinweiser().getId());
                        prep.setBoolean(4, einw.isFehlerhaft());
                        prep.setDate(5, einw.getDatum());
                        
			if (prep.executeUpdate() != 0) {
				Verbindung.closeConnection();
				return true;
			} else {
				Verbindung.closeConnection();
				return false;
			}

		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return false;
		}
	}

	@Override
	public boolean einweisungAlsFehlerhaftMarkieren(Einweisung einw) {
		 try {
       PreparedStatement prep = Verbindung.getConnection().prepareStatement(
               "UPDATE tbl_Einweisungen SET istFehlerhaft=True WHERE pf_geraetetyp=? AND pf_eingewiesender=?");
       prep.setString(1, einw.getGeraetetyp().getTyp());
       prep.setString(2, einw.getEingewiesener().getId());
       
       if(prep.executeUpdate() == 1){
         Verbindung.closeConnection();
         return true;
       }
       Verbindung.closeConnection();
       return false;
     }catch (SQLException ex) {
       Verbindung.closeConnection();
       return false;
     }		
	}

	@Override
	public boolean setzePflichtEinweisung(Geraetetyp g, boolean status) {
		try {
			PreparedStatement ps = Verbindung.getConnection().prepareStatement( 
					"Update tbl_Geraetetypen SET Einweisungsnotwendigkeit='Pflicht' WHERE p_Geraetetyp=?");
			ps.setString(1, g.getTyp());
			ps.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public boolean setzeWunschEinweisung(Geraetetyp g, boolean status) {
		try {
			PreparedStatement ps = Verbindung.getConnection().prepareStatement( 
					"Update tbl_Geraetetypen SET Einweisungsnotwendigkeit='Wunsch' WHERE p_Geraetetyp=?");
			ps.setString(1, g.getTyp());
			ps.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public boolean personalErfassen(Mitarbeiter ma) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
					"INSERT INTO tbl_Mitarbeiter(p_personalnummer, vorname, nachname, titel, anrede, funktion) VALUES (?,?,?,?,?)");
			prep.setString(1, ma.getId());
			prep.setString(2, ma.getVorname());
			prep.setString(3, ma.getNachname());
			prep.setString(4, ma.getTitel());
			prep.setString(5, ma.getAnrede());
			prep.setString(6, ma.getFunktion());

			if (prep.executeUpdate() != 0) {
				Verbindung.closeConnection();
				return true;
			} else {
				Verbindung.closeConnection();
				return false;
			}
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return false;
		}
	}

	@Override
	public boolean personalErfassen(List<Mitarbeiter> ma) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean personalBearbeiten(Mitarbeiter ma) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
					"UPDATE tbl_Mitarbeiter SET  vorname=?, nachname=?, titel=?, anrede=?, funktion=? WHERE p_personalnummer = ? ");
			prep.setString(1, ma.getVorname());
			prep.setString(2, ma.getNachname());
			prep.setString(3, ma.getTitel());
			prep.setString(4, ma.getAnrede());
			prep.setString(5, ma.getFunktion());
      prep.setString(6, ma.getId());
      
			if (prep.executeUpdate() != 0) {
				Verbindung.closeConnection();
				return true;
			} else {
				Verbindung.closeConnection();
				return false;
			}
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return false;
		}
	}

	@Override
	public Mitarbeiter personalAbfragen(String personalNr) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
              "SELECT * FROM t_Mitarbeiter WHERE p_personalnummer=?");
			prep.setString(1, personalNr);
			ResultSet rs = prep.executeQuery();

			while (rs.next()) {
				Mitarbeiter tmp = new Mitarbeiter(rs.getString("p_personalnummer"), rs.getString("vorname"), rs.getString("nachname"), rs.getString("titel"),
						rs.getString("anrede"), rs.getString("funktion"));
				Verbindung.closeConnection();
				return tmp;
			}
			Verbindung.closeConnection();
			return null;
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return null;
		}
	}

	@Override
	public boolean geraetErfassen(List<Geraet> g) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean geraetErfassen(Geraet g) {
		try {
			PreparedStatement prep = Verbindung.getConnection().prepareStatement(
              "INSERT INTO tbl_Geraetetypen(p_geraetetyp, bezeichnung, hersteller) VALUES (?,?,?)");
			prep.setString(1, g.getGeraetetyp().getTyp());
			prep.setString(2, g.getGeraetetyp().getGeraetebezeichnung());
			prep.setString(3, g.getGeraetetyp().getHersteller());

			if (prep.executeUpdate() != 0) {
				Verbindung.closeConnection();
				return true;
			} else {
				Verbindung.closeConnection();
				return false;
			}
		} catch (SQLException ex) {
			Logger.getLogger(Datenhaltung.class.getName()).log(Level.SEVERE, null, ex);
			Verbindung.closeConnection();
			return false;
		}
	}

	@Override
	public boolean geraetAktualisieren(Geraet g) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public List<Geraet> getGeraete() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Geraetetyp> getGeraetetyp() {
		// TODO Auto-generated method stub
		return null;
	}
}
